import { MapCore } from '../mapCore';

/**
 * 数据加载策略接口
 */
export interface IDataLoadingStrategy {
  /**
   * 判断是否应该使用该策略
   * @param featureCount 要素数量
   * @param dataSize 数据大小（字节）
   */
  shouldUseStrategy(featureCount: number, dataSize: number): boolean;

  /**
   * 加载数据
   * @param sourceId 数据源ID
   * @param data 数据源规范
   * @param mapCore MapCore实例
   * @param context 上下文信息（用于日志等）
   */
  loadData(
    sourceId: string,
    data: mapboxgl.GeoJSONSourceSpecification,
    mapCore: MapCore,
    context?: ILoadingContext,
  ): Promise<string>;
}

/**
 * 加载上下文接口
 */
export interface ILoadingContext {
  /**
   * 安全日志输出方法
   */
  safeLog?: (message: string, data?: any) => void;

  /**
   * 性能配置
   */
  performanceConfig?: {
    enableDetailedLogging: boolean;
    maxConsoleOutputs: number;
    consoleOutputCount: number;
  };
}

/**
 * 默认数据加载策略 - 直接使用MapCore的标准方法
 */
export class StandardLoadingStrategy implements IDataLoadingStrategy {
  shouldUseStrategy(featureCount: number): boolean {
    return featureCount <= 5000; // 小数据量使用标准策略
  }

  async loadData(
    sourceId: string,
    data: mapboxgl.GeoJSONSourceSpecification,
    mapCore: MapCore,
    context?: ILoadingContext,
  ): Promise<string> {
    context?.safeLog?.('📊 使用标准加载策略');
    return mapCore.addOrUpdateSource(sourceId, data);
  }
}
